#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>

using namespace std;

// 前10名对应的积分值
const int POINTS[] = {25, 18, 15, 12, 10, 8, 6, 4, 2, 1};

// 用于保存每个车手的排位统计信息
struct DriverStats {
    string name;
    vector<int> rank_counts; // rank_counts[i] 表示该车手获得第i+1名的次数
};

// 计算车手的总得分
int calculateTotalPoints(vector<int>& ranks) {
    int total = 0;
    for (int i = 0; i < 10 && i < (int)ranks.size(); ++i) {
        if (i < 10) {
            total += POINTS[i] * ranks[i]; // 前10名才计入积分
        }
    }
    return total;
}

// 比较函数：原始规则 —— 先比总分，再比各个排位出现的次数
bool compareByOriginalRule(DriverStats& a,DriverStats& b) {
    // 计算总分
    int scoreA = calculateTotalPoints(a.rank_counts);
    int scoreB = calculateTotalPoints(b.rank_counts);

    // 如果总分不同，按总分从高到低排序
    if (scoreA != scoreB) {
        return scoreA > scoreB;
    }

    // 总分相同，则依次比较第1名、第2名……出现的次数
    for (int i = 0; i < (int)a.rank_counts.size() && i < (int)b.rank_counts.size(); ++i) {
        if (a.rank_counts[i] != b.rank_counts[i]) {
            return a.rank_counts[i] > b.rank_counts[i];
        }
    }

    // 如果所有排位都一样，按名字字典序确保排序唯一性
    return a.name < b.name;
}

// 比较函数：可选规则 —— 先比第一，再比总分，最后回到原始规则
bool compareByAlternativeRule(DriverStats& a,DriverStats& b) {
    // 第一步：先比较第一名的次数
    if (a.rank_counts[0] != b.rank_counts[0]) {
        return a.rank_counts[0] > b.rank_counts[0];
    }

    // 第二步：如果第一名次数相同，比较总积分
    int scoreA = calculateTotalPoints(a.rank_counts);
    int scoreB = calculateTotalPoints(b.rank_counts);
    if (scoreA != scoreB) {
        return scoreA > scoreB;
    }

    // 第三步：如果总积分也相同，按照原始规则继续比较
    for (int i = 0; i < (int)a.rank_counts.size() && i < (int)b.rank_counts.size(); ++i) {
        if (a.rank_counts[i] != b.rank_counts[i]) {
            return a.rank_counts[i] > b.rank_counts[i];
        }
    }

    // 最后按名字排序确保唯一性
    return a.name < b.name;
}

int main() {
    int t;
    cin >> t;

    // 存储所有车手的信息：key是名字，value是各排位出现的次数
    unordered_map<string, vector<int>> driverRankMap;

    for (int race = 0; race < t; ++race) {//第几局比赛
        int n;
        cin >> n;

        for (int pos = 0; pos < n; ++pos) {//按照位次输出
            string name;
            cin >> name;

            // 如果这个车手还没记录过，就初始化一个足够长的数组
            if (driverRankMap.find(name) == driverRankMap.end()) {
                driverRankMap[name] = vector<int>(n, 0); // 初始化为当前场次长度
            }

            // 如果当前记录长度不够，扩展至n个位置
            if ((int)driverRankMap[name].size() < n) {
                driverRankMap[name].resize(n, 0);
            }

            // 在对应位置加1（表示获得了第 pos+1 名）
            driverRankMap[name][pos]++;
        }
    }

    // 将数据转换为 DriverStats 结构体，方便排序
    vector<DriverStats> drivers;
    for (auto& entry : driverRankMap) {
        drivers.push_back({entry.first, entry.second});
    }

    // 使用原始规则排序并输出冠军
    sort(drivers.begin(), drivers.end(), compareByOriginalRule);
    cout << drivers[0].name << endl;

    // 使用可选规则排序并输出冠军
    sort(drivers.begin(), drivers.end(), compareByAlternativeRule);
    cout << drivers[0].name << endl;

    return 0;
}
